package com.ship.dispatch.bpm.service;

import com.ship.common.core.base.Page;
import com.ship.common.core.web.domain.JsonResult;
import com.ship.dispatch.bpm.vo.BpmQueryVo;
import com.ship.dispatch.bpm.vo.BpmTaskVo;
import com.ship.dispatch.bpm.vo.dto.BpmTaskDto;
import com.ship.dispatch.bpm.vo.dto.FormTemplate;
import com.ship.dispatch.bpm.vo.dto.TaskDto;
import com.ship.dispatch.bpm.vo.task.BpmTaskApproveReqVO;
import com.ship.dispatch.bpm.vo.task.BpmTaskTodoItemRespVO;
import com.ship.dispatch.vo.fileTemplate.NodeVO;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 *@title TaskService
 *@description 流程任务操作接口
 *@author yl
 *@create 2023/12/13
 */

public interface TaskService {
    /**
     * 获取所有流程中所有节点
     * @return
     */
    List<FormTemplate> getFormTemplates();
    /**
     * 审批任务
     *
     * @param task 请求实体参数
     */
    JsonResult complete(BpmTaskVo task);

    /**
     * 驳回任务
     *
     * @param flowTaskVo
     */
    void taskReject(BpmTaskVo flowTaskVo);


    /**
     * 退回任务
     *
     * @param flowTaskVo 请求实体参数
     */
    void taskReturn(BpmTaskVo flowTaskVo);

    /**
     * 获取所有可回退的节点
     *
     * @param flowTaskVo
     * @return
     */
    JsonResult findReturnTaskList(BpmTaskVo flowTaskVo);

    /**
     * 删除任务
     *
     * @param flowTaskVo 请求实体参数
     */
    void deleteTask(BpmTaskVo flowTaskVo);

    /**
     * 认领/签收任务
     *
     * @param flowTaskVo 请求实体参数
     */
    void claim(BpmTaskVo flowTaskVo);

    /**
     * 取消认领/签收任务
     *
     * @param flowTaskVo 请求实体参数
     */
    void unClaim(BpmTaskVo flowTaskVo);

    /**
     * 委派任务
     *
     * @param flowTaskVo 请求实体参数
     */
    void delegateTask(BpmTaskVo flowTaskVo);

    /**
     * 任务归还
     *
     * @param flowTaskVo 请求实体参数
     */
    void resolveTask(BpmTaskVo flowTaskVo);


    /**
     * 转办任务
     *
     * @param flowTaskVo 请求实体参数
     */
    void assignTask(BpmTaskVo flowTaskVo);


    /**
     * 多实例加签
     * @param flowTaskVo
     */
    void addMultiInstanceExecution(BpmTaskVo flowTaskVo);

    /**
     * 多实例减签
     * @param flowTaskVo
     */
    void deleteMultiInstanceExecution(BpmTaskVo flowTaskVo);

    /**
     * 我发起的流程
     * @param queryVo  请求参数
     * @return
     */
    JsonResult myProcess(BpmQueryVo queryVo);

    /**
     * 取消申请
     * 目前实现方式: 直接将当前流程变更为已完成
     * @param flowTaskVo
     * @return
     */
    JsonResult stopProcess(BpmTaskVo flowTaskVo);

    /**
     * 撤回流程
     * @param flowTaskVo
     * @return
     */
    JsonResult revokeProcess(BpmTaskVo flowTaskVo);


    /**
     * 代办任务列表
     *
     * @param queryVo  请求参数
     * @return
     */
    JsonResult todoList(BpmQueryVo queryVo);


    /**
     * 已办任务列表
     *
     * @param queryVo  请求参数
     * @return
     */
    JsonResult finishedList(BpmQueryVo queryVo);

    /**
     * 流程历史流转记录
     *
     * @param procInsId 流程实例Id
     * @return
     */
    JsonResult flowRecord(String procInsId);


    /**
     * 获取流程过程图
     * @param processId
     * @return
     */
    InputStream diagram(String processId);

    /**
     * 获取流程执行节点
     * @param procInsId
     * @return
     */
    JsonResult getFlowViewer(String procInsId,String executionId);

    /**
     * 获取流程变量
     * @param taskId
     * @return
     */
    JsonResult processVariables(String taskId);

    /**
     * 流程初始化表单
     * @param deployId
     * @return
     */
    JsonResult flowFormData(String deployId);

    /**
     * 流程节点信息
     * @param procInsId
     * @return
     */
    JsonResult flowXmlAndNode(String procInsId,String deployId);

    /**
     * 流程节点表单
     * @param taskId 流程任务编号
     * @return
     */
    JsonResult flowTaskForm(String taskId) throws Exception;
    /**
     * 获取当前登录用户待办任务列表
     * @param processInstaneId
     * @return
     */
    JsonResult todoProcessInstanceList(String processInstaneId);

    /**
     * 获取流程实例所有任务信息
     *
     * @return
     */
    default JsonResult getProcessAllTasks() {
        return getProcessAllTasks(null);
    }

    /**
     * 获取流程实例所有任务信息
     * @param processInstaneId
     * @return
     */
    JsonResult getProcessAllTasks(String processInstaneId);

    /**
     * 获取当前节点名称
     * @param key
     * @return
     */
    String getNodeNameByKey(String key);

    /**
     * 增加流程公共变量
     * @param map
     */
    void addVaribals(Map<String,Object> map,String taskId);

    /**
     * 获取任务名称
     * @param taskId
     * @return
     */
    String getTaskName(String taskId);

    /**
     * 查询指定任务后续节点
     * @param processInstanceId
     * @param taskId
     * @return
     */
    List<TaskDto> findTaskIdNextNode(String processInstanceId,String taskSId);

    /**
     * 判断后续任务是否可开启
     * @param processInstanceId
     * @param taskId
     * @return
     */
    List<TaskDto> findTaskIdStartNode(String processInstanceId, String taskId);

    /**
     * 待办任务分页
     * @param taskReqVo
     * @return
     */
    JsonResult<Page<BpmTaskTodoItemRespVO>> todoPageList(BpmQueryVo taskReqVo);

    /**
     * 操作任务
     * @param userId
     * @param reqVO
     */
    void approveTask(String userId, BpmTaskApproveReqVO reqVO);

    JsonResult<List<TaskDto>> getTaskInfo(String definitionId);

    List<BpmTaskDto> findActivitiOrFinishTaskResult(String orderProcessId);

    JsonResult getProcessAllTaskINfo(String processId);

    /**
     * 流程任务信息
     * @param taskId
     * @return
     */
    JsonResult getProcessTaskINfo(String taskId);

    /**
     * 导出审批记录
     * @param taskReqVo
     * @return
     */
    List<BpmTaskTodoItemRespVO> exportList(BpmQueryVo taskReqVo);

    List<NodeVO> getAllTasks();

    /**
     * 获取任务信息进行回显
     * @param serviceType
     * @param serviceId
     * @return
     */
    JsonResult getTaskFormData(String serviceType, Long serviceId);

    /***
     *
     * @param taskReqVo
     * @return
     */
    List<BpmTaskTodoItemRespVO> taskExportList(BpmQueryVo taskReqVo);
}
